// ✅ 策略模块：select32ByS3.js（马尔科夫策略）
// 🎯 S3 策略：马尔科夫转移策略（Markov）
// 基于历史数据中号码之间的转移关系，预测下一个可能出现的号码

const _ = require("lodash");

/**
 * 构建一阶马尔科夫转移矩阵
 * @param {Array} temp - 历史数据窗口
 * @returns {Object} 转移频率矩阵，如 { '01': { '23': 3, '14': 2 }, ... }
 */
function buildMarkovMatrix(temp) {
  const matrix = {};

  for (let i = 1; i < temp.length; i++) {
    const prev = temp[i - 1].number.toString().padStart(2, '0');
    const curr = temp[i].number.toString().padStart(2, '0');

    if (!matrix[prev]) matrix[prev] = {};
    matrix[prev][curr] = (matrix[prev][curr] || 0) + 1;
  }

  return matrix;
}

/**
 * S3 策略：基于马尔科夫转移预测下一期
 * @param {Array} temp - 历史数据窗口
 * @returns {Array<string>} - 32 个号码（字符串格式）
 */
function select32ByS3(temp) {
  if (temp.length < 2) return [];

  const matrix = buildMarkovMatrix(temp);

  // 上一期号码作为当前状态
  const prevNumber = temp[temp.length - 1].number.toString().padStart(2, '0');
  const transitions = matrix[prevNumber] || {};

  // 对所有可能转移的号码按频率降序排序
  const probableNext = Object.entries(transitions)
    .sort((a, b) => b[1] - a[1])
    .map(([num]) => num);

  // 所有号码（补全用）
  const allNumbers = Array.from({ length: 49 }, (_, i) =>
    (i + 1).toString().padStart(2, '0')
  );

  // 补足至 32 个
  const result = _.uniq([...probableNext, ..._.shuffle(allNumbers)]).slice(0, 32);

  return result;
}

module.exports = select32ByS3;
